import datetime
from datetime import timedelta
import numpy as np
import matplotlib.pyplot as plt
from django.utils import timezone
from matplotlib.ticker import MaxNLocator
from scipy.interpolate import interp1d

from user.models import ProjUser


def get_ab_graph(username: str):
    # 取出用户
    user = ProjUser.objects.get(username=username)
    # 取出用户近十天的做题记录(不包含今天，共十天)
    today = timezone.now().date()
    logs = {}
    for d in range(1, 11):  # 一天前到十天前
        new_list = []
        date = today - timedelta(days=d)
        start_datetime = datetime.datetime.combine(date, timezone.datetime.min.time())
        end_datetime = datetime.datetime.combine(date, timezone.datetime.max.time())
        new_list = list(user.submit_logs.filter(submit_time__range=(start_datetime, end_datetime)))
        logs[d] = new_list
    # 计算近十天的正确率，以列表形式存储在rates中
    rates = []
    for d in range(10, 0, -1):
        log = logs[d]
        total = 0
        right = 0
        for lg in log:
            if lg.is_correct:
                right += 1
            total += 1
        rates.append(right/total) if total != 0 else rates.append(0.0)
    plt.figure(figsize=(12, 6))
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    x_ticks = []
    x_labels = []

    plt.style.use('bmh')

    for i in range(9, -1, -1):
        x_ticks.append(i)
        day = (timezone.now().date() - timedelta(days=(10-i))).strftime('%m/%d')
        x_labels.append(day)
        plt.xticks(x_ticks, x_labels)

    plt.bar(x_labels, rates, width=0.40, color='#d63461ff', edgecolor='#4d16a4ff', linewidth=1.4)

    interp_func = interp1d(range(len(x_labels)), rates, kind='cubic')
    x_interp = np.linspace(0, len(x_labels) - 1, 100)
    y_interp = interp_func(x_interp)
    y_interp[y_interp < 0] = 0
    y_interp[y_interp > 1] = 1
    # 绘制穿过所有样本点的曲线
    plt.plot(x_interp, y_interp, linestyle='-.', label='穿过所有样本点的曲线', color='#25c9a3ff', linewidth=2)

    plt.title('您近期的训练正确率变动({dt})'.format(dt=timezone.now().date().strftime('%m/%d')), fontsize=15, y=1.05)
    plt.xlabel('日期')
    plt.ylabel('正确率(%)')

    name = 'abg-' + username + '.png'

    plt.savefig('./pics/' + name)  # 在项目根目录下需要有个文件夹`pics`

    return name


def get_t_graph(username: str):
    # 取出用户
    user = ProjUser.objects.get(username=username)
    # 取出用户近十天的做题记录(不包含今天，共十天)
    today = timezone.now().date()
    totals = []
    for d in range(1, 11):  # 一天前到十天前
        date = today - timedelta(days=d)
        start_datetime = datetime.datetime.combine(date, timezone.datetime.min.time())
        end_datetime = datetime.datetime.combine(date, timezone.datetime.max.time())
        day_total = user.submit_logs.filter(submit_time__range=(start_datetime, end_datetime)).count()
        totals.append(day_total)

    totals = totals[::-1]

    plt.figure(figsize=(12, 6))
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    x_ticks = []
    x_labels = []

    plt.style.use('bmh')

    for i in range(9, -1, -1):
        x_ticks.append(i)
        day = (timezone.now().date() - timedelta(days=(10 - i))).strftime('%m/%d')
        x_labels.append(day)
        plt.xticks(x_ticks, x_labels)

    plt.bar(x_labels, totals, width=0.40, color='#e95709ff', edgecolor='#4d16a4ff', linewidth=1.4)

    plt.title('您近期的日做题统计数据({dt})'.format(dt=timezone.now().date().strftime('%m/%d')), fontsize=15, y=1.05)
    plt.xlabel('日期')
    plt.ylabel('单日做题总数')

    ax = plt.gca()
    ax.yaxis.set_major_locator(MaxNLocator(integer=True))

    name = 'tg-' + username + '.png'

    plt.savefig('./pics/' + name)  # 在项目根目录下需要有个文件夹`pics`

    return name
